﻿#pragma once

#include "Core.h"
#include "spdlog/spdlog.h"
#include "spdlog/fmt/ostr.h"	///< spdlog IO流操作符

namespace Hazal
{
	class HZ_DLL_OPTION CLog
	{
	public:
		CLog();

		~CLog();

	public:
		// 初始化日志记录器
		static void Init();

		// 获取Core日志记录器
		inline static Ref<spdlog::logger>& GetCoreLogger() { return s_CoreLogger; }

		// 获取Core日志记录器
		inline static Ref<spdlog::logger>& GetClinetLogger() { return s_ClientLogger; }

	private:
		static Ref<spdlog::logger> s_CoreLogger;	///< Core日志记录器
		
		static Ref<spdlog::logger> s_ClientLogger;	///< 客户端日志记录器
	};
}

#ifdef _DEBUG
// CoreLogger 日志级别
#define LOG_CORE_TRACE(...) Hazal::CLog::GetCoreLogger()->trace(__VA_ARGS__)		// Core-Trace级别日志
#define LOG_CORE_DEBUG(...) Hazal::CLog::GetCoreLogger()->debug(__VA_ARGS__)		// Core-Debug级别日志
#define LOG_CORE_INFO(...)	Hazal::CLog::GetCoreLogger()->info(__VA_ARGS__)			// Core-Info级别日志
#define LOG_CORE_WARN(...)	Hazal::CLog::GetCoreLogger()->warn(__VA_ARGS__)			// Core-Warn级别日志
#define LOG_CORE_ERROR(...) Hazal::CLog::GetCoreLogger()->error(__VA_ARGS__)		// Core-Error级别日志
#define LOG_CORE_FATAL(...) Hazal::CLog::GetCoreLogger()->critical(__VA_ARGS__)		// Core-Critical级别日志

// ClientLogger 日志级别
#define LOG_TRACE(...)		Hazal::CLog::GetClinetLogger()->trace(__VA_ARGS__)		// Client-Trace级别日志
#define LOG_DEBUG(...)		Hazal::CLog::GetClinetLogger()->debug(__VA_ARGS__)		// Client-Debug级别日志
#define LOG_INFO(...)		Hazal::CLog::GetClinetLogger()->info(__VA_ARGS__)		// Client-Info级别日志
#define LOG_WARN(...)		Hazal::CLog::GetClinetLogger()->warn(__VA_ARGS__)		// Client-Warn级别日志
#define LOG_ERROR(...)		Hazal::CLog::GetClinetLogger()->error(__VA_ARGS__)		// Client-Error级别日志
#define LOG_FATAL(...)		Hazal::CLog::GetClinetLogger()->critical(__VA_ARGS__)	// Client-Critical级别日志

#else
// no define
#define LOG_CORE_TRACE(...) 
#define LOG_CORE_DEBUG(...) 
#define LOG_CORE_INFO(...)	
#define LOG_CORE_WARN(...)	
#define LOG_CORE_ERROR(...) 
#define LOG_CORE_FATAL(...) 

#define LOG_TRACE(...)		
#define LOG_DEBUG(...)		
#define LOG_INFO(...)		
#define LOG_WARN(...)		
#define LOG_ERROR(...)		
#define LOG_FATAL(...)		

#endif